using Avalonia.Controls;
using Avalonia.Controls.Templates;
using System;

namespace FileSyncApp;

/// <summary>
/// 视图定位器类，实现Avalonia UI的数据模板接口
/// 负责根据数据类型动态创建对应的视图控件
/// 支持ViewModel到View的自动映射，遵循MVVM设计模式
/// 当找不到对应视图时，提供友好的错误提示
/// </summary>
public class ViewLocator : IDataTemplate
{
    /// <summary>
    /// 根据提供的数据对象构建对应的视图控件
    /// 实现以下逻辑：
    /// 1. 如果数据为null，返回提示文本
    /// 2. 如果数据是字符串，直接显示该字符串
    /// 3. 如果数据是ViewModel，尝试查找对应的View并创建实例
    /// 4. 如果找不到对应的View或创建失败，返回错误提示
    /// </summary>
    /// <param name="data">要显示的数据对象，通常是ViewModel实例</param>
    /// <returns>对应的视图控件，如果无法创建则返回包含错误信息的TextBlock</returns>
    public Control Build(object? data)
    {
        if (data is null)
            return new TextBlock { Text = "data was null" };

        // 如果数据是字符串，直接显示
        if (data is string str)
            return new TextBlock { Text = str };

        var name = data.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
        var type = Type.GetType(name);

        if (type != null)
        {
            try
            {
                var control = (Control)Activator.CreateInstance(type)!;
                return control;
            }
            catch
            {
                return new TextBlock { Text = "Failed to create: " + name };
            }
        }

        return new TextBlock { Text = "Not Found: " + name };
    }

    /// <summary>
    /// 判断此数据模板是否适用于给定的数据对象
    /// 当前实现接受所有非null的数据对象
    /// </summary>
    /// <param name="data">要检查的数据对象</param>
    /// <returns>如果数据不为null则返回true，否则返回false</returns>
    public bool Match(object? data)
    {
        return data is not null;
    }
}